package com.xncoding.design.observation.demo;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
/**
 * 数据仓储
 * @author Administrator
 */
public class Storage {

	
	
	private final BlockingQueue<Product> queues=new LinkedBlockingQueue<Product>(10);
	//待处理的数据
    private ConcurrentLinkedQueue<Product> workQueue;
    
    public Storage(ConcurrentLinkedQueue<Product> workQueue){
    	this.workQueue=workQueue;
    }
    
    public ConcurrentLinkedQueue<Product> getWorkQueue(){
    	return this.workQueue;
    }
	/**
	 * 生产
	 * @param p
	 * 
	 */
	public void push(Product p) throws InterruptedException{
		this.queues.put(p);
	}
	
	/**
	 * 消费
	 * 使用poll方法比take方法要好，因为这样可以避免工作完成时，某一线程出现无线等待的情况，
	 * 返回null,Consumer中的循环会执行continue,然后判断工作是已经完成了，
	 * 这样很好的解决了工作完成时可能出现的无限阻塞情况
	 * 
	 */
	public Product pop() throws InterruptedException{
			if(getWorkQueue().isEmpty()&&isEmpty()){//工作完成
				return null;
			}
		    return queues.poll(50, TimeUnit.MILLISECONDS);
	}

	public boolean isEmpty(){
		   return queues.isEmpty();
	}
	
	
}
